package com.wongoing.jwt;

import java.util.Date;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

import org.apache.log4j.Logger;

import com.wongoing.bus.util.Constants;

public class TokenManager extends BaseTokenManager{

	private static final Logger logger = Logger.getLogger(TokenManager.class);
	
	private Map<String, JwtUserModel> tokenMap = new ConcurrentHashMap<String, JwtUserModel>();
	
	private static TokenManager instance;
	
	public static TokenManager getInstance(){
		if(instance != null){
			return instance;
		}
		instance = new TokenManager();
		return instance;
	}
	
	/**
	 * 功能说明：只创建token不放入内存
	 * 修改说明：
	 * @author 吴兆强
	 * @date 2018年4月18日 上午8:59:14
	 * @param userModel
	 * @return
	 */
	public String createTokenWithoutMap(String userName) {
		long nowMillis = System.currentTimeMillis();
	    Date iat = new Date(nowMillis); // 创建时间
	    Date exp = createExpDate(Constants.JWT_EXPIRES_TIMES); // 过期时间
		String token = super.createToken(userName, iat, exp);
		if(token == null) return null;
        return token;
    }
	
	/**
	 * 功能说明：通用创建token方法
	 * 修改说明：
	 * @author 吴兆强
	 * @date 2018年3月28日 下午1:11:56
	 * @param userModel
	 * @return
	 */
	public String createToken(JwtUserModel userModel) {
		
		long nowMillis = System.currentTimeMillis();
	    Date iat = new Date(nowMillis); // 创建时间
	    Date exp = createExpDate(Constants.JWT_APP_EXPIRES_TIMES); // 过期时间
	    
		String token = super.createToken(userModel.getUserName(), iat, exp);
		if(token == null){
			return null;
		}
		
		userModel.setToken(token);
		userModel.setExp(exp);
		userModel.setIat(iat);
		
		// 放入内存
		tokenMap.put(userModel.getUserName(), userModel);
		
        return token;
    }
	
	
	/**
	 * 功能说明：检验token是否合法
	 * 修改说明：
	 * @author 吴兆强
	 * @date 2018年3月28日 下午1:13:24
	 * @param token
	 * @return
	 */
	public String checkToken(String token) {
		String userName = null;
		try {
			userName = super.parseJWT(token);
		} catch (Exception e) {
			logger.error(e);
		}
		return userName;
	}

	/**
	 * 功能说明：通用根据用户名获取token
	 * 修改说明：
	 * @author 吴兆强
	 * @date 2018年3月28日 下午1:13:42
	 * @param userName
	 * @return
	 */
	public String getToken(String userName) {
		JwtUserModel userModel = tokenMap.get(userName);
		if(userModel == null){
			return null;
		}
		return userModel.getToken();
	}

	/**
	 * 功能说明：通用删除token方法
	 * 修改说明：
	 * @author 吴兆强
	 * @date 2018年3月28日 下午1:15:31
	 * @param userName
	 */
	public void deleteToken(String userName) {
		tokenMap.remove(userName);
	}

	/**
	 * 功能说明：通用刷新过期时间方法
	 * 修改说明：
	 * @author 吴兆强
	 * @date 2018年3月28日 下午1:16:34
	 * @param userName
	 */
	public void refreshExpDate(String userName) {
		JwtUserModel token = tokenMap.get(userName);
		if(token == null){
			return;
		}
		Date expiration = createExpDate(Constants.JWT_APP_EXPIRES_TIMES);
		token.setExp(expiration);
	}

	
	/**
	 * 功能说明：通用获取用户信息方法
	 * 修改说明：
	 * @author 吴兆强
	 * @date 2018年3月28日 下午1:17:41
	 * @param userName
	 * @return
	 */
	public JwtUserModel getUserModel(String userName) {
		return tokenMap.get(userName);
	}

}
